﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Net.Sockets;
using System.Net;


namespace WebProxy_MMTNC
{
    public partial class Form1 : Form
    {
        Server server;
        List<TcpListener> Temp = new List<TcpListener>();
        public Form1()
        {
            InitializeComponent();
            List<IPAddress> IP = new List<IPAddress>();
            IP = LayIPHienHanh();
            foreach (var item in IP)
            {
                cbx_IP.Items.Add(item.ToString());
            }
            cbx_IP.SelectedIndex = 0;
        }
        
               private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnKetNoi_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(cbx_IP.Text) || String.IsNullOrEmpty(txtPort.Text))
            {
                MessageBox.Show("Bạn phải nhập địa chỉ IP và port vào");
                return;
            }
            if (Int32.Parse(txtPort.Text) < 1024 || Int32.Parse(txtPort.Text) > 49151)
            {
                MessageBox.Show("Port phải nằm trong giá trị từ 1024 đến 49151");
                return;
            }
            server = new Server(IPAddress.Parse(cbx_IP.Text), Int32.Parse(txtPort.Text));
            if (btnKetNoi.Text == "Kết Nối")
            {
                btnKetNoi.Text = "Ngừng Kết Nối port2";
                server.Start();
                cbx_IP.Enabled = true;
                lbnThongBao.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtPort.Text + ") ";
                cbx_IP.Enabled = false;
                txtPort.Enabled = false;
            }
            else
            {
                btnKetNoi.Text = "Kết Nối";
                server.Stop();
                lbnThongBao.Text = "Proxy Server đã ngừng tạm ngưng kết nối";
                cbx_IP.Enabled = true;
                txtPort.Enabled = true;
            }
        }
        public static List<IPAddress> LayIPHienHanh()
        {
            List<IPAddress> Local_IP = new List<IPAddress>();
            try
            {
                IPHostEntry hostEntry = Dns.Resolve(Dns.GetHostName());
                for (int i = 0; i < hostEntry.AddressList.Length; i++)
                {
                    Local_IP.Add(hostEntry.AddressList[i]);
                }
                return Local_IP;
            }
            catch
            {
                Local_IP.Add(IPAddress.Any);
                return Local_IP;
            }
        }

        private void groupBox2_Enter(object sender, EventArgs e)
        {

        }

        private void btnPort2_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(cbx_IP.Text) || String.IsNullOrEmpty(txtport2.Text))
            {
                MessageBox.Show("Bạn phải nhập địa chỉ IP và port vào");
                return;
            }
            if (Int32.Parse(txtport2.Text) < 1024 || Int32.Parse(txtport2.Text) > 49151)
            {
                MessageBox.Show("Port phải nằm trong giá trị từ 1024 đến 49151");
                return;
            }
            server = new Server(IPAddress.Parse(cbx_IP.Text), Int32.Parse(txtport2.Text));
            if (btnPort2.Text == "Start2")
            {
                btnPort2.Text = "Cancel";
                server.Start();
               // cbx_IP.Enabled = true;
             //   lbnThongBao.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Host: " + txtport2.Text + ") ";
                MessageBox.Show("Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport2.Text + ") ");
                lbnThongBaoport2.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport2.Text;
               // cbx_IP.Enabled = false;
                txtport2.Enabled = false;
            }
            else
            {
                btnPort2.Text = "Start2";
                server.Stop();
                MessageBox.Show("Proxy Server đã ngừng tạm ngưng kết nối" + txtport2.Text);
                lbnThongBaoport2.Text = "Proxy Server đã ngừng tạm ngưng kết nối" + txtport2.Text;
                //cbx_IP.Enabled = true;
                txtport2.Enabled = true;
            }

        }

        private void btnstart3_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(cbx_IP.Text) || String.IsNullOrEmpty(txtport3.Text))
            {
                MessageBox.Show("Bạn phải nhập địa chỉ IP và port vào");
                return;
            }
            if (Int32.Parse(txtport3.Text) < 1024 || Int32.Parse(txtport3.Text) > 49151)
            {
                MessageBox.Show("Port phải nằm trong giá trị từ 1024 đến 49151");
                return;
            }
            server = new Server(IPAddress.Parse(cbx_IP.Text), Int32.Parse(txtport3.Text));
            if (btnstart3.Text == "Start3")
            {
                btnstart3.Text = "Cancel";
                server.Start();
                // cbx_IP.Enabled = true;
                //   lbnThongBao.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Host: " + txtport2.Text + ") ";
                MessageBox.Show("Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport3.Text + ") ");
                lbnThongBaoPort3.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport3.Text;
                // cbx_IP.Enabled = false;
                txtport3.Enabled = false;
            }
            else
            {
                btnstart3.Text = "Start3";
                server.Stop();
                MessageBox.Show("Proxy Server đã ngừng tạm ngưng kết nối" + txtport3.Text);
                lbnThongBaoPort3.Text = "Proxy Server đã ngừng tạm ngưng kết nối" + txtport3.Text;
                //cbx_IP.Enabled = true;
                txtport3.Enabled = true;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(cbx_IP.Text) || String.IsNullOrEmpty(txtport4.Text))
            {
                MessageBox.Show("Bạn phải nhập địa chỉ IP và port vào");
                return;
            }
            if (Int32.Parse(txtport4.Text) < 1024 || Int32.Parse(txtport4.Text) > 49151)
            {
                MessageBox.Show("Port phải nằm trong giá trị từ 1024 đến 49151");
                return;
            }
            server = new Server(IPAddress.Parse(cbx_IP.Text), Int32.Parse(txtport4.Text));
            if (btnStart4.Text == "Start4")
            {
                btnstart3.Text = "Cancel";
                server.Start();
                // cbx_IP.Enabled = true;
                //   lbnThongBao.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Host: " + txtport2.Text + ") ";
                MessageBox.Show("Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport4.Text + ") ");
                lbnThongBaoPort4.Text = "Proxy Server đang lắng nghe tại địa chỉ:  (IP: " + cbx_IP.Text + " | Port: " + txtport4.Text;
                
                // cbx_IP.Enabled = false;
                txtport4.Enabled = false;
            }
            else
            {
                btnStart4.Text = "Start4";
                server.Stop();
                MessageBox.Show ("Proxy Server đã ngừng tạm ngưng kết nối tại port" + txtport4.Text);
                lbnThongBaoPort4.Text = "Proxy Server đã ngừng tạm ngưng kết nối tại port" + txtport4.Text;
                //cbx_IP.Enabled = true;
                txtport4.Enabled = true;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (btnThemPort.Text == "Thêm Port")
            {
                groupBox2.Visible = true;
            }
            else
            {
                groupBox2.Visible = false;
            }
        }






        //}
        //class WebProxy2
        //{
        //    Socket clientSocket;
        //    Byte[] read = new byte[1024];
        //    Byte[] Buffer = null;
        //    Encoding UTF8 = Encoding.UTF8;
        //    const string HTTP_VERSION = "HTTP/1.0";
        //    const string CRLF = "\r\n";
        //    Byte[] RecvBytes = new Byte[4096];
        //    public WebProxy2(Socket socket)
        //    {
        //        this.clientSocket = socket;
        //    }
        //    public void run()
        //    {
        //        String clientmessage = " ", sURL = " ";
        //        int bytes = readmessage(read, ref clientSocket, ref clientmessage);
        //        if (bytes == 0)
        //        {
        //            return;
        //        }
        //        int index1 = clientmessage.IndexOf(' ');
        //        int index2 = clientmessage.IndexOf(' ', index1 + 1);
        //        if ((index1 == -1) || (index2 == -1))
        //        {
        //            throw new IOException();
        //        }

        //        Label.l
        //        Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1));
        //        Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint);
        //        string part1 = clientmessage.Substring(index1 + 1, index2 - index1);
        //        int index3 = part1.IndexOf('/', index1 + 8);
        //        int index4 = part1.IndexOf(' ', index1 + 8);
        //        int index5 = index4 - index3;
        //        sURL = part1.Substring(index1 + 4, (part1.Length - index5) - 8);
        //        try
        //        {
        //            IPHostEntry IPHost = Dns.Resolve(sURL);
        //            Console.WriteLine("Request resolved: ", IPHost.HostName);
        //            string[] aliases = IPHost.Aliases;
        //            IPAddress[] address = IPHost.AddressList;
        //            Console.WriteLine(address[0]);
        //            IPEndPoint sEndpoint = new IPEndPoint(address[0], 80);
        //            Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //            IPsocket.Connect(sEndpoint);
        //            if (IPsocket.Connected)
        //                Console.WriteLine("Socket connect OK");
        //            string GET = clientmessage;
        //            Byte[] ByteGet = UTF8.GetBytes(GET);
        //            IPsocket.Send(ByteGet, ByteGet.Length, 0);
        //            Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
        //            Console.WriteLine("Recieved {0}", +rBytes);
        //            //Buffer = RecvBytes;
        //            String strRetPage = null;
        //            strRetPage = strRetPage + UTF8.GetString(RecvBytes, 0, rBytes);
        //            while (rBytes > 0)
        //            {
        //                rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
        //                strRetPage = strRetPage + UTF8.GetString(RecvBytes, 0, rBytes);
        //            }
        //            IPsocket.Shutdown(SocketShutdown.Both);
        //            IPsocket.Close();
        //            sendmessage(clientSocket, strRetPage);
        //        }
        //        catch (Exception exc2)
        //        {
        //            Console.WriteLine(exc2.ToString());
        //        }
        //    }
        //    private int readmessage(byte[] ByteArray, ref Socket s, ref String clientmessage)
        //    {
        //        int bytes = s.Receive(ByteArray, 1024, 0);
        //        string messagefromclient = Encoding.ASCII.GetString(ByteArray);
        //        clientmessage = (String)messagefromclient;
        //        return bytes;
        //    }
        //    private void sendmessage(Socket s, string message)
        //    {
        //        Buffer = new Byte[message.Length + 1];
        //        int length = UTF8.GetBytes(message, 0, message.Length, Buffer, 0);
        //        s.Send(Buffer, length, 0);
        //    }

    }
    

}
